Many types of digital computer systems utilize code transformation/translation or emulation to implement software-based functionality. Generally, translation and emulation both involve examining a program of software instructions and performing the functions and actions dictated by the software instructions, even though the instructions are not “native” to the computer system. In the case of translation, the non-native instructions are translated into a form of native instructions which are designed to execute on the hardware of the computer system. Examples include prior art translation software and/or hardware that operates with industry standard x86 applications to enable the applications to execute on non-x86 or alternative computer architectures. Generally, a translation process utilizes a large number of processor cycles, and thus, imposes a substantial amount of overhead. The performance penalty imposed by the overhead can substantially erode any benefits provided by the translation process.
One attempt at solving this problem involves the use of just-in-time compilation. Just-in-time compilation (JIT), also known as dynamic translation, is a method to improve the runtime performance of computer programs. Traditionally, computer programs had two modes of runtime transformation, either interpretation mode or JIT (Just-In-Time) compilation/translation mode. Interpretation is a decoding process that involves decoding instruction by instruction to transform the code from guest to native with lower overhead than JIT compilation, but it produces a transformed code that is less performing. Additionally, the interpretation is invoked with every instruction. JIT compilers or translators represent a contrasting approach to interpretation. With JIT conversion, it usually has a higher overhead than interpreters, but it produces a translated code that is more optimized and one that has higher execution performance. In most emulation implementations, the first time a translation is needed, it is done as an interpretation to reduce overhead, after the code is seen (executed) many times, a JIT translation is invoked to create a more optimized translation.
However, the code transformation process still presents a number of problems. The JIT compilation process itself imposes a significant amount of overhead on the processor. This can cause a large delay in the start up of the application. Additionally, managing the storage of transformed code in system memory causes multiple trips back and forth to system memory and includes memory mapping and allocation management overhead, which imposes a significant latency penalty. Furthermore, changes to region of execution in the application involve relocating the transformed code in the system memory and code cache, and starting of the process from scratch. The interpretation process involves less overhead than JIT translation but its overhead is repeated per instruction and thus is still relatively significant. The code produced is poorly optimized if at all.